// #include <stdio.h>
// #include <signal.h>
// #include <unistd.h>

// void Count(int cnt)
// {
//     while (cnt)
//     {
//         printf("cnt: %d\r", cnt--);
//         fflush(stdout);
//         sleep(1);
//     }
//     printf("\n");
// }

// void handler(int signo)
// {
//     printf("get a signo: %d\n", signo);
//     Count(20);
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     act.sa_flags = 0;
//     //  sigemptyset（） 初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含 任何有效信号
//     sigemptyset(&act.sa_mask); // 当我们正在处理某一种信号的时候， 我们也想顺便屏蔽其他信号，就可以添加到这个sa_mask中
//     //例：
//     // sigaddset() 用于将指定的信号添加到信号集中
//     sigaddset(&act.sa_mask, 3); // 就是把3号射进信号集里面，未来捕捉2号信号的时候，顺便把3号信号屏蔽了
//     sigaction(SIGINT, &act, &oact);
//     while (1)
//     {
//         sleep(1);
//     }
// }

//   volatile 关键字

// #include <stdio.h>
// #include <signal.h>

// // volatile: 保持内存可见性
// volatile int quit = 0;

// void handler(int signo)
// {

//     printf("%d 信号，正在被捕捉！\n", signo);
//     printf("quit：%d", quit);
//     quit = 1;
//     printf("-> %d\n", quit);
// }

// int main()
// {

//     signal(2, handler);
//     while (!quit)
//         ;
//     printf("注意， 我是正常退出的\n");
// }

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

// signal child

void handler(int signo)
{

    printf("pid: %d, %d 信号，正在被捕捉！\n", getpid(), signo);
}

void Count(int cnt)
{
    while (cnt)
    {
        printf("cnt: %d\r", cnt--);
        fflush(stdout);
        sleep(1);
    }
    printf("\n");
}

int main()
{
    signal(SIGCHLD, handler);
    printf("我是父进程，%d, ppid: %d\n", getpid(), getppid());
    pid_t id = fork();

    if (id == 0)
    {
        // 子进程
        printf("我是子进程，%d, ppid: %d 我要退出了\n", getpid(), getppid());
        Count(5);
        exit(1);
    }

    // 父进程
    while (1)
    {
        /* code */
        sleep(1);
    }

    return 0;
}